﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;
namespace QLNS.Class
{
    class DB
    {
        public SqlConnection Cn = new SqlConnection();
        public string getConnection()
        {
            //Hàm lấy chuỗi kết nối tùy thuộc vào lựa chọn của người dùng.
            //Có 2 cách kết nối tới CSDL: Xác thực theo Windows hoặc Xác thực theo SQL

            String con = "";
            if (QLNS.Properties.Settings.Default.XacThuc == "SQL")
            {
                //Láy chuỗi kết nối theo xác thực SQL
                con = "Data Source = " + QLNS.Properties.Settings.Default.TenMayChu +
                     ";Initial Catalog = " + QLNS.Properties.Settings.Default.TenCSDL +
                     ";User ID= " + QLNS.Properties.Settings.Default.TaiKhoan +
                     ";Password = " + QLNS.Properties.Settings.Default.MatKhau;
            }
            else
            {
                //Lấy chuỗi kết nối theo xác thực windows
                con = "Data Source = " + QLNS.Properties.Settings.Default.TenMayChu +
                    ";database = " + QLNS.Properties.Settings.Default.TenCSDL +
                    ";Integrated Security = True; Connect Timeout  =10; User Instance = False";
            }
            return con;
        }

        public bool KetNoi()
        {
            string ChuoiKetNoi = this.getConnection();// Lấy chuỗi kết nối
            try
            {
                Cn = new SqlConnection(ChuoiKetNoi); //Thực hiện kết nối tới máy chủ và lưu và đối tượng Cn
                Cn.Open();
                return true;
            }
            catch
            {
            }
            return false;
        }

        public DataTable getTable(string sql)
        {
            try
            {
                if (Cn.State == ConnectionState.Closed) //Kiểm tra trạng thái kết nối tới máy chủ
                {
                    Cn.Open(); //Thực hiện mở kết nối
                }
                DataSet ds = new DataSet();

                SqlDataAdapter dt = new SqlDataAdapter(sql, Cn);

                dt.Fill(ds, sql);//Đưa dữ liệu vào trong dataset: cụ thể là chứa trong đối tượng ds

                DataTable tbl = ds.Tables[0];

                return tbl;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            return null;
        }
        public bool Insert_Table(string TenBang, string dscot, string dsGiaTri)
        {
            //Xây dựng hàm chèn một bản ghi mới vào table
            //TenBang: Bảng cần chèn dữ liệu
            //dsCot: Danh sách cột nhận giá trị
            //dsGiaTri: Danh sách giá trị chèn vào cột tương ứng

            string sql = "INSERT INTO " + TenBang + "(" + dscot + ") VALUES (" + dsGiaTri + ")";

            try
            {
                if (Cn.State == ConnectionState.Closed)
                {
                    Cn.Open();
                }

                SqlCommand cmd = new SqlCommand(sql, Cn);//Khai báo đối tượng cmd thuộc vào lớp Sqlcommand thực thi lệnh sql dựa trên kết nối cn

                cmd.ExecuteNonQuery(); //Thực hiện lệnh sql dựa trên kết nối của đối tượng cn

                return true;
            }
            catch
            {
            }
            return false;
        }
        public bool Update_Table(string TenBang, string chuoicapnhat, string dieukien)
        {
            string sql = "UPDATE " + TenBang + " SET " + chuoicapnhat + " WHERE " + dieukien;

            try
            {
                if (Cn.State == ConnectionState.Closed)
                {
                    Cn.Open();
                }

                SqlCommand cmd = new SqlCommand(sql, Cn);//Khai báo đối tượng cmd thuộc vào lớp Sqlcommand thực thi lệnh sql dựa trên kết nối cn

                cmd.ExecuteNonQuery(); //Thực hiện lệnh sql dựa trên kết nối của đối tượng cn

                return true;
            }
            catch
            {
            }
            return false;
        }
        public bool Delete_Table(string TenBang, string DieuKien)
        {
            string sql = "DELETE " + TenBang + " WHERE " + DieuKien;

            try
            {
                if (Cn.State == ConnectionState.Closed)
                {
                    Cn.Open();
                }

                SqlCommand cmd = new SqlCommand(sql, Cn);//Khai báo đối tượng cmd thuộc vào lớp Sqlcommand thực thi lệnh sql dựa trên kết nối cn

                cmd.ExecuteNonQuery(); //Thực hiện lệnh sql dựa trên kết nối của đối tượng cn

                return true;
            }
            catch
            {
            }
            return false;
        }
        public string LayDuLieu(string sql)
        {
            string temp = "";
            try
            {
                SqlCommand cmd = new SqlCommand(sql, Cn);//Khai báo đối tượng cmd thuộc lớp Sqlcommand để thực hiện câu lệnh truy vấn sql

                SqlDataReader drd;//Lưu trữ kết quả thu được từ cmd

                if (Cn.State == ConnectionState.Closed)   //Kiểm tra trạng kết nối
                {
                    Cn.Open();  //Mở lại kết nối trong trường hợp trạng thái của Cn là Closed
                }

                drd = cmd.ExecuteReader(); //Đọc dữ liệu và lưu vào trong đối tượng Drd

                if (drd.HasRows)
                {
                    drd.Read(); //Đọc lấy một dòng dữ liệu đầu tiên trong drd
                    temp = drd.GetValue(0).ToString();
                }

                drd.Close();
                Cn.Close();
            }
            catch
            {
                //  MessageBox.Show(ex.ToString());
            }
            return temp;
            //sql = select MaPhongBan, TenPhongBan from tbl_PhongBan Where MaPhongBan = 'PB002'
            //Nếu kết quả trả về mà có được nhiều bản ghi
            // PB001            A
            // PB002            B
        }
        //hàm sinh mã này. mã có 5 ký tự thôi. nó cắt 2 ký tự đầu. và thêm 3 ký tự sau là số.
        public string SinhMa(string id, string TenBang, string pre)
        {
            string temp = "";
            temp = this.LayDuLieu("select max(" + id + ") from " + TenBang);//Lấy giá trị lớn nhất trong bảng rồi lưu vào biến temp
            if (temp == "")
            {
                temp = "00000";
            }
            temp = temp.Substring(2, 3);//Cắt một chuỗi con từ chuỗi temp, bắt đầu từ vị trí số 2 và lấy 3 kí tự kế tiếp
            //DT002->002
            int i = int.Parse(temp); //Chuyển chuỗi temp sang dạng số nguyên dương
            i++;
            if (i > 99)
            {
                temp = pre + i.ToString();//DV100;DV101
            }
            else if (i > 9)
            {
                temp = pre + "0" + i.ToString();//DV010,DV011
            }
            else
            {
                temp = pre + "00" + i.ToString();
            }
            return temp;
        }

        public void getCombo(ComboBox cbName, string ValueMember, string DisplayMember, string TableName)
        {
            string sql = "";
            sql = "select " + ValueMember + "," + DisplayMember + " from " + TableName;

            SqlCommand cmd = new SqlCommand(sql, Cn);

            DataTable tbl = new DataTable();

            DataColumn col1 = new DataColumn("ID", typeof(string));
            DataColumn col2 = new DataColumn("Ten", typeof(string));

            tbl.Columns.Add(col1);
            tbl.Columns.Add(col2);

            DataRow row = null;
            SqlDataReader dr;
            try
            {
                if (Cn.State == ConnectionState.Closed)
                {
                    Cn.Open();
                }
                dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    row = tbl.NewRow();
                    tbl.Rows.Add(row);
                    row["ID"] = dr.GetString(0);
                    row["Ten"] = dr.GetString(1);

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            cbName.DataSource = tbl;
            cbName.DisplayMember = "Ten";
            cbName.ValueMember = "ID";
        }

    }
}
